package com.shop.service.impl;

import com.shop.service.MinioService;
import io.minio.*;
import io.minio.http.Method;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * author 何鸿鹰
 * date 2025/4/26 14:02
 * ClassName com.shop.service.impl
 *
 * @version 1.0
 */

@Service
public class MinioServiceImpl implements MinioService {
    @Autowired
    private MinioClient minioClient;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Value("${minio.endpoint}")
    private String endpoint;
    /**
     * 上传MultipartFile文件
     * @param file 文件
     * @return 文件访问URL
     * @throws Exception 上传异常
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception {
// 生成唯一文件名
        String originalFilename = file.getOriginalFilename();
        String fileName = generateFileName(originalFilename);
// 执行上传
        minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .contentType(file.getContentType())
                        .stream(file.getInputStream(), file.getSize(), -1)
                        .build()
        );
// 返回文件URL
        return getFileUrl(fileName);
    }
    /**
     * 获取文件的URL
     * @param fileName 文件名
     * @return 文件URL
     * @throws Exception MinIO异常
     */
    public String getFileUrl(String fileName) throws Exception {
// 生成临时访问URL
      return endpoint+"/"+bucketName+"/"+fileName;
    }
    /**
     * 检查文件是否存在
     * @param fileName 文件名
     * @return 是否存在
     */
    public boolean isFileExist(String fileName) {
        try {
            minioClient.statObject(
                    StatObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .build()
            );
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * 删除文件
     * @param fileName 文件名
     * @throws Exception MinIO异常
     */
    public void deleteFile(String fileName) throws Exception {
        minioClient.removeObject(
                RemoveObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .build()
        );
    }
    /**
     * 生成唯一文件名
     * @param originalFilename 原始文件名
     * @return 唯一文件名
     */
    private String generateFileName(String originalFilename) {
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String extension = "";
        if (originalFilename != null && originalFilename.contains(".")) {
            extension = originalFilename.substring(originalFilename.lastIndexOf("."));
        }
        return uuid + extension;
    }
}
